1

前言

学习SQL注入,那么就需要对SQL语句有一定的了解。首先介绍一篇对SQL介绍的博文:十步完全理解SQL

这篇是写SQL注入基础,在此之前,搜集到一篇不错的博文,对注入的原理分析不错,为了不重复造轮子,故此就引用下连接:SQL Injection with MySQL 注入分析

正文

在上一篇文章解释了order by猜列数的问题,但是并没有回答为何要用order by猜列数的问题。

如angel文章写道的那样:查询字段分为:本表查询跟跨表(联合)查询。 order by猜出来的列数是为了跨表(联合)查询用的。 order by 跟union组合使用,可以快速获取结果集的字段长度(列数)跟字段对应的值,仅此而已。

在不用这个组合之前,用ascii可以猜解字段(这个现在用的少了,而且学的不深入,所以未详细写)

在用union 联合爆出字段值时,SQL语法对union语句有这样的说明:

UNION is used to combine the result from multiple SELECT statements into a single result set.

The column names from the first SELECT statement are used as the column names for the results returned. Selected columns listed in corresponding positions of each SELECT statement should have the same data type. (For example, the first column selected by the first statement should have the same type as the first column selected by the other statements.)

If the data types of corresponding SELECT columns do not match, the types and lengths of the columns in the UNION result take into account the values retrieved by all of the SELECT statements.

即:在用UNION时,列于每个SELECT语句的对应位置的被选择的列应具有相同的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。简单的说,也就是UNION后面查选的字段数量、字段类型都应该与前面的SELECT一样,而且,如果前面的SELECT为真,就同时返回两个SELECT的结果,当前面的SELECT为假,就会返回第二个SELECT所得的结果,某些情况会替换掉在第一个SELECT原来应该显示的字段。

故此我们就应该理解什么要先猜出列数,而且在构造联合语句时,我们通常让前面的select语句为false,如下:

and 1=2 union select concat(id,0x232323,user,0x232323,pwd),2 from admin

这样就能快速的得到字段对应的值了

参考更多: 利用insert,update和delete注入获取数据


mugbya
1.2k 声望41 粉丝

时间永远分岔,通往无数未来